package main

import (
	"fmt"
	"log"
	"net/http"

	"github.com/gorilla/websocket"
)

// 创建一个 websocket.Upgrader 对象
var upgrader = websocket.Upgrader{
	CheckOrigin: func(r *http.Request) bool {
		// CheckOrigin 函数用于检查请求的来源是否合法,即允许跨域访问
		return true
	},
}

func websocketHandler(w http.ResponseWriter, r *http.Request) {
	// 将 HTTP 连接升级为 WebSocket 连接   //request 参数包含了客户端发起连接时提供的 URL 信息ws://localhost:8088/userid
	conn, err := upgrader.Upgrade(w, r, nil)
	if err != nil {
		log.Println("升级为 WebSocket 连接失败:", err)
		return
	}

	// 读取客户端发送的消息
	for {
		//阻塞式的操作。当调用这个方法时，如果没有接收到新的消息，它将一直阻塞等待，直到收到新的消息或发生错误。
		messageType, p, err := conn.ReadMessage()
		if err != nil {
			log.Println("读取消息失败:", err)
			break
		}

		// 在控制台打印接收到的消息
		log.Printf("接收到消息: %s", p)

		// 构建回复消息
		response := []byte(fmt.Sprintf("接收到消息: %s", p))

		// 通过websocket推送，去回复客户端消息，客户端会及时接收到这份信息
		err = conn.WriteMessage(messageType, response)
		if err != nil {
			log.Println("发送消息失败:", err)
			break
		}
	}

	// 关闭 WebSocket 连接
	err = conn.Close()
	if err != nil {
		log.Println("关闭连接失败:", err)
	}
}

func main() {
	http.HandleFunc("/ws", websocketHandler)
	log.Println("WebSocket 服务器运行在 http://localhost:8000/ws")
	err := http.ListenAndServe(":8088", nil)
	if err != nil {
		log.Fatal("启动服务器失败:", err)
	}
}
